import { type AxiosRequestConfig, type CancelTokenSource } from 'axios'

// 定义一个接口，表示正在等待处理的请求的相关信息
interface PendingRequest {
  url: string // 请求的URL地址
  method: string // 请求的方法，如GET、POST等
  cancelTokenSource: CancelTokenSource // 用于取消请求的令牌源
}

// 请求管理器类，用于管理正在进行中的Axios请求
class RequestManager {
  // 存储正在等待处理的请求的数组
  private pendingRequests: PendingRequest[] = []
  // 定义一个时间窗口，单位为毫秒，用于判断请求是否超时未处理
  private requestTimeout = 2000

  // 方法：将一个新的请求添加到正在等待处理的请求列表中，并设置超时处理
  addPendingRequest(config: AxiosRequestConfig, cancelTokenSource: CancelTokenSource): void {
    // 将新请求的相关信息添加到pendingRequests数组中
    this.pendingRequests.push({
      url: config.url || '', // 如果Axios请求配置中的URL为空，则使用空字符串作为默认值
      method: config.method || 'GET', // 如果Axios请求配置中的方法为空，则默认使用GET方法
      cancelTokenSource,
    })

    // 设置一个定时器，当达到指定的时间窗口（requestTimeout）后，执行移除该请求的操作
    setTimeout(() => {
      this.removePendingRequest(config.url || '', config.method || 'GET')
    }, this.requestTimeout)
  }

  // 方法：从正在等待处理的请求列表中移除指定URL和方法的请求
  removePendingRequest(url: string, method: string): void {
    // 通过过滤操作，移除符合指定URL和方法的请求，更新pendingRequests数组
    this.pendingRequests = this.pendingRequests.filter((request) => !(request.url === url && request.method === method))
  }

  // 方法：判断给定的Axios请求配置是否与正在等待处理的请求列表中的某个请求重复
  isDuplicateRequest(config: AxiosRequestConfig): boolean {
    // 遍历正在等待处理的请求列表，检查是否存在与给定配置具有相同URL和方法的请求
    return this.pendingRequests.some((request) => request.url === config.url && request.method === config.method)
  }

  // 方法：取消所有正在等待处理的请求，并清空请求列表
  cancelAllRequests(): void {
    // 遍历所有正在等待处理的请求，调用每个请求的取消令牌源来取消请求，并给出取消原因
    this.pendingRequests.forEach((request) => {
      request.cancelTokenSource.cancel('Request canceled due to duplicate request or other reason.')
    })

    // 清空正在等待处理的请求列表
    this.pendingRequests = []
  }
}

// 创建一个RequestManager类的实例，用于在其他模块中使用
const requestManager = new RequestManager()

// 将创建的requestManager实例导出，以便在其他模块中可以引入并使用
export { requestManager }
